# :]
print("""
================================================================================
                                *** image_zip ***
================================================================================
NOME: image_zip.py

AUTOR: Joao Victor N. Siqueira.
       Instituto do Homem e Meio Ambiente da Amazonia.
       Estagiario de Engenharia Ambiental(Geoprocessamento).
       email: joaovictor@imazon.org.br

PROPOSITO: Este script compacta ou descompacta arquivos no formato ZIP. Para
usa-lo voce deve escolher (1)para compactar ou (2)para descompactar, e inserir
o caminho dos arquivos.

REQUISITOS: python 3.0.1

HISTORICO: 1) JUN 2009
================================================================================
""")

print(
"""OPCOES:
================================================================================
1 - COMPACTAR
2 - DESCOMPACTAR
================================================================================
""")

# Importando os modulos.
import glob, zipfile, zlib, time, os.path                            

# Definindo as funcoes.
## Descompacta todos os arquivos name.
def Unzip(name):
    for i in range(len(name)):                                 
        try:
            # Imprime o nome dos arquivos name.
            print ('%d)' % (i+1), name[i])
            # Usa a classe ZipFile para abrir o arquivo name para leitura.
            z = zipfile.ZipFile(name[i],'r',zipfile.ZIP_DEFLATED)
            # Extrai todo o conteudo do arquivo name.
            z.extractall(diret)
            # Fecha o arquivo extraido.
            z.close()                                              
            print()
        except:
            # Caso contrario imprime a msg.
            print(name[i], 'nao foi descompactado')
            
## Compacta as imagens(name[i]) junto com o cabecalho(name[i+1]).
def Zip(name):
    for i in range(0,len(name),2):
        try:
            # Padroniza somente o nome do arquivo ignorando o diretorio.
            name_img = os.path.basename(name[i])   # Imagem
            name_hdr = os.path.basename(name[i+1]) # Cabecalho
            # Imprime os nomes.
            print ('%d)' % (i+1), name[i])
            print ('%d)' % (i+1), name[i+1])

            # Usa a classe ZipFile para criar um arquivo zip.
            z = zipfile.ZipFile(name[i]+'.zip','w',zipfile.ZIP_DEFLATED)
            # Compacta a imagem. 
            z.write(name[i], name_img, zipfile.ZIP_DEFLATED)
            # Compacta o cabecalho.
            z.write(name[i+1], name_hdr, zipfile.ZIP_DEFLATED)
            # Fecha o arquivo zip.
            z.close()
        except:
            # Caso contrario imprime a msg.
            print(name[i], 'nao foi compactado')

## Cria uma variavel para armazenar o diretorio dos arquivos name.
def Entrada():
    # Variavel que armazena o diretorio.
    diret = input('Entre com diretorio dos arquivos: ')
    # Se o diretorio for branco o programa termina.
    if diret == '': quit()
    # Retorna o valor da variavel.
    return diret

# Inicia o programa.
# Cria uma variavel que armazena o tipo de operacao.
tipo = input('Digite o numero da opcao: ')
# Se o valor for branco fecha o programa.
if tipo == '': quit()

# Inicia a contagem do tempo de processamento.
t0 = time.clock()

# Se 1 executa a funcao Zip.
if tipo == '1':
    print('COMPACTAR')
    # Executa a funcao Entrada.
    diret = Entrada()
    # Busca todos os arquivos contidos no diretorio diret.
    name = glob.glob(diret + '\*')
    # Compacta os arquivos name.
    Zip(name)

    # Encerra a contagem do tempo e imprime o seu valor.
    t1 = (time.clock()-t0)/60.                                
    print('=' * 44)                                            
    print('Arquivos compactados em: %f minutos' % t1)

# Se 2 executa a funcao Unzip.
elif tipo == '2':
    print('DESCOMPACTAR')
    # Executa a funcao Entrada. 
    diret = Entrada()
    # Busca todos os arquivos contidos no diretorio diret.
    name = glob.glob(diret + '\*.zip')

    ## Se nao encontrar nenhum arquivo zip, faz uma busca nas subpastas.
    if name == list():
        # Busca todas as subpastas.
        new_diret = glob.glob(diret +'\\*')
        # Em cada subpasta busca por arquivos zip. 
        for j in range(len(new_diret)):
            # Padroniza as subpastas como novo diret.
            diret = new_diret[j]
            # Busca em cada subpasta por todo arquivo zip.
            name = glob.glob(diret + '\*.zip')
            # Descompacta os arquivos name.zip.
            Unzip(name)

    ## Se encontrar os arquivos zip descompacta todos.
    else: Unzip(name)
    # Encerra a contagem do tempo e imprime o seu valor.
    t1 = (time.clock()-t0)/60.                                
    print('=' * 44)                                            
    print('Arquivos descompactados em: %f minutos' % t1)

# Caso contrario msg e fecha o programa.
else:
    print('O valor nao este dentro do campo')
    quit()
#
# :]
